package  org.tity.commons.lang;

import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;

import org.tity.commons.lang.DataParser;


/**
 * 字符串提取工具，可用于HTML内数据提取
 * */
public class StringPicker {

	private String html;
	private LinkedHashMap<String,Object> data=new LinkedHashMap<String,Object>();
	
	public HashMap<String, Object> getData()
	{
		return data;
	}
	
	/**
	 * 手动设定提取值
	 * @param fld  变量名
	 * @param val 变量值
	 * */
	public void setValue(String fld,Object val)
	{
		data.put(fld,val);
	}
	
	/**
	 * 打印数据
	 * */
	public void printData()
	{
		int i=0;
		for (String as : data.keySet())
		{
			System.out.println(i+"\t\t\t"+as+"\t\t\t"+data.get(as));
			i++;
		}
		System.out.println("==================================");
	}

	/**
	 * @param html 文本内容
	 * */
	public StringPicker(String html)
	{
		this.html=html;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public String getString(String after, String begin, String end)
	{
		return getString(after, begin, end,null,0);
	}
	
	/**
	 * 从 beginIndex 开始检索，提取在 after 后，begin 和 end 之间的文本内容
	 * @param beginIndex 检索的起始位置
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public String getString(String after, String begin, String end,int beginIndex)
	{
		return getString(after, begin, end,null,beginIndex);
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public String getString(String after, String begin, String end, String storeField)
	{
		return getString(after, begin, end,storeField,0);
	}

	/**
	 * 从 beginIndex 开始检索，提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param beginIndex 检索起始位置
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @param beginIndex 检索的起始位置
	 * @return 返回提取值
	 * */
	public String getString(String after, String begin, String end,String storeField,int beginIndex)
	{
		if (html == null || html.length() == 0)
			return "";
		int i = html.indexOf(after,beginIndex);
		
		if (i == -1)
			return "";
		i = html.indexOf(begin, i + after.length());
		if (i == -1)
			return "";
		int j=0;
		if(end!=null)
		{
			j = html.indexOf(end, i + begin.length());
			if (j == -1)
				return "";
		}
		else
		{
			j=html.length();
		}
		String ret = html.substring(i + begin.length(), j);
		ret=ret.trim();
		if(storeField!=null) data.put(storeField, ret);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Long getLong(String after, String begin, String end,String storeField)
	{
		String str=getString(after, begin, end,storeField);
		Long ret=DataParser.parseLong(str);
		data.put(storeField, ret);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Long getLong(String after, String begin, String end)
	{
		String str=getString(after, begin, end);
		Long ret=DataParser.parseLong(str);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Integer getInt(String after, String begin, String end,String storeField)
	{
		String str=getString(after, begin, end,storeField);
		Integer ret=DataParser.parseInteger(str);
		data.put(storeField, ret);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Integer getInt(String after, String begin, String end)
	{
		String str=getString(after, begin, end,null);
		Integer ret=DataParser.parseInteger(str);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Date getDate(String after, String begin, String end,String storeField)
	{
		String str=getString(after, begin, end,storeField);
		Date ret=DataParser.parseDate(str);
		data.put(storeField, ret);
		return ret;
	}
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Double getDouble(String after, String begin, String end)
	{
		return getDouble(after, begin, end,null);
	}
	
	
	/**
	 * 提取在 after 后，begin 和 end 之间的文本内容
	 * @param storeField 以storeField作为key存起来，使用getData()获取
	 * @param after 提取在after之后的内容
	 * @param begin 以begin作为提取的开始
	 * @param end   以end作为提取的结束
	 * @return 返回提取值
	 * */
	public Double getDouble(String after, String begin, String end,String storeField)
	{
		String str=getString(after, begin, end,storeField);
		Double ret=null;
		try {
			ret = DataParser.parseDouble(str);
		} catch (Exception e) {
			
		}
		if(storeField!=null)data.put(storeField, ret);
		return ret;
	}
	
	/**
	 * 获取直接在 word 后的数字
	 * @param beginIndex 检索起始位置
	 * @param word 匹配识别点
	 * @return 提取的值
	 * */
	public Double getDoubleAfter(int beginIndex,String word)
	{
		return getDoubleAfter(beginIndex,word,null);
	}
	
	/**
	 * 获取直接在 word 后的数字
	 * @param word 匹配识别点
	 * @return 提取的值
	 * */
	public Double getDoubleAfter(String word)
	{
		return getDoubleAfter(-1,word,null);
	}
	
	/**
	 * 获取直接在 word 后的数字
	 * @param storeField 以storeField作为key存起来，使用getData()获取、
	 * @param word 匹配识别点
	 * @return 提取的值
	 * */
	public Double getDoubleAfter(String word,String storeField)
	{
		return getDoubleAfter(-1, word,storeField);
	}
	
	/**
	 * 获取直接在 word 后的数字
	 * @param storeField 以storeField作为key存起来，使用getData()获取、
	 * @param beginIndex 以storeField作为key存起来，使用getData()获取
	 * @param beginIndex 检索起始位置
	 * @param word 匹配识别点
	 * @return 提取的值
	 * */
	public Double getDoubleAfter(int beginIndex,String word,String storeField)
	{
		String nums=".0123456789";

		int a=html.indexOf(word,beginIndex);
		
		
		int b=a;
		int start=-1;
		int end=-1;
		while(true)
		{
			String x=html.charAt(b)+"";
			b++;	
			if(start==-1&& end==-1 )
			{
				if(nums.indexOf(x)==-1)
				{
					continue;
				}
				else
				{
					start=b;
				}
			}

			if(start>0 && end==-1)
			{
				if(nums.indexOf(x)==-1)
				{
					 end=b;
					 break;
				}
				else
				{
					continue;
				}
			}
		 
		}
		
		String n1=html.substring(start-1,end-1);
		Double n2=Double.parseDouble(n1);
		
		if(storeField!=null)
		{
			data.put(storeField, n2);
		}
		
		return n2;
		
	}
	
	 
	
	 
}
